﻿package composants
{
	import flash.display.Graphics;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.*;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.net.*;
	import flash.sampler.NewObjectSample;
	import flash.text.TextField;
	import flash.text.engine.BreakOpportunity;
	import flash.ui.Mouse;
	
	import mx.containers.Canvas;
	import mx.containers.HBox;
	import mx.containers.Panel;
	import mx.controls.Alert;
	import mx.controls.Button;
	import mx.controls.HSlider;
	import mx.core.UIComponent;
	import mx.managers.CursorManager;
	import mx.validators.EmailValidator;


	/**
	 *
	 * Cette classe représente la grille de topographie du monde.
	 * Construction de salles.
	 * Placement d'objets (portes, oeuvres, fenêtres).
	 */
	public class GridRoom extends Canvas
	{
		/**
		 * Pour un bitmap (porte, chaise, table...)
		 */
		private var bmp:BitmapLoader;
		/**
		 * Valeur max de la taille de la grille
		 * @default 600
		 */
		private var gridSize:uint=600;
		/**
		 * Taille de a grille
		 * @default 0
		 */
		private var taille:uint=0;
		/**
		 * Valeur max d'un carreau de a grille
		 * @default 100
		 */
		public var pasSize:uint=100;
		/**
		 * Echelle normale de la grille
		 * @default 60
		 */
		private var echelleNormale:Number=60;
		/**
		 * Abscisse d'un point (du mur)
		 * @default -1
		 */
		private var x1:int=-1;
		/**
		 * Ordonnée d'un point (du mur)
		 * @default -1
		 */
		private var y1:int=-1;
		/**
		 * Gestion de l'échelle
		 * @default 1
		 */
		private var scale:Number=1;
		/**
		 * Proportion des objets
		 * @default 1
		 */
		public var objetProportion:Number=1;
		/**
		 * Tout mur instancié sera stocké dans cette variable
		 * @default null
		 */
		public var tabMurs:Array=new Array();
		/**
		 * Toute ouverture instanciée(oeuvre, fenêtre, porte...) sera stockée dans cette variable
		 * @default null
		 */
		public var tabOuvertures:Array=new Array();
		/**
		 * Tout meuble instancié sera stocké dans cette variable
		 * @default null
		 */
		public var tabMeubles:Array=new Array();
		/**
		 * Tout angle instancié sera stocké dans cette variable
		 * @default null
		 */
		public var tabAngles:Array=new Array();
		/**
		 * Tableau qui stocke toutes les images (bitmap) des ouvertures
		 * @default null
		 */
		public var tabBitmapLoader:Array=new Array();
		/**
		 * Type de la sélection courante (oeuvre, fenêtre, porte...)
		 */
		public var typeSelection:String;
		/**
		 * Pour verifier si l'objet sélectionné est vraiment posé sur la scène avant de faire un traitement
		 * @default false
		 */
		public var oeuvrePose:Boolean=false;
		/**
		 * Texte de description d'une oeuvre
		 * @default chaine vide
		 */
		public var texte:String="";
		/**
		 * Texte qui représente l'id de la transition pour la porte
		 * @default chaine vide
		 */
		public var idTransition:String="";
		/**
		 * A chaque sélection d'un objet, on y stocke l'url de l'image contenue dans l'objet en question
		 * @default chaine vide
		 */
		public var urlImageCourante:String="";
		/**
		 * Url de l'image du mur
		 * @default chaine vide
		 */
		public var urlImageMur:String="";
		/**
		 * Comporte l'ensemble des descriptions des oeuvres
		 * @default null
		 */
		public var listeDescription:Array=new Array();
		/**
		 * On stocke dedans tous les "urlImageCourante"
		 * @default null
		 */
		public var listeUrlImage:Array=new Array();
		/**
		 * Tableau des meubles sélectionnés
		 * @default null
		 */
		public var meublesSelec:Array=new Array();
		/**
		 * Conteneur d'élément graphique
		 */
		private var cercle:UIComponent;
		/**
		 * Conteneur d'élément graphique
		 */
		private var ligne:UIComponent;
		/**
		 * Conteneur d'élément graphique
		 */
		private var startLoc:UIComponent;
		/**
		 * Tableau de coordonées pour le point de départ de la caméra
		 * @default null
		 */
		public var coordStartLoc:Array=new Array();
		/**
		 * Pour le rectangle de sélection
		 */
		private var rectSelect:UIComponent;
		/**
		 * Abscisse du point d'origine de la souris
		 */
		private var xOrigPosMouse:int;
		/**
		 * Ordonnée du point d'origine de la souris
		 */
		private var yOrigPosMouse:int;
		/**
		 * Contient la valeur limite pour le nombre aléatoire
		 * @default 100000
		 */
		public var limite:Number=100000;
		/**
		 * Identifiant affecté à une salle lors de la création de son xml
		 */
		public var identifiantSalle:int;
		/**
		 * Réprésente le nom de la salle que l'on crée
		 */
		private var nomSalle:String;
		/**
		 * Comporte l'ensemble des id de transition
		 * @default null
		 */
		public var listeIdTransition:Array=new Array();


		/**
		 * Constructeur : création de la grille
		 */
		public function GridRoom()
		{
			doubleClickEnabled=true;
			cercle=new UIComponent();
			addChild(cercle);

			ligne=new UIComponent();
			addChild(ligne);

			startLoc=new UIComponent();
			addChild(startLoc);

			typeSelection="curseur"; // Etat initial de la sélection

			height=gridSize;
			width=gridSize;
			this.addEventListener(MouseEvent.CLICK, clicSurLaGrille, false, 10);
			this.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClicSurLaGrille, false, 10);
			this.addEventListener(MouseEvent.MOUSE_MOVE, deplacementSurLaGrille, false, 10);
			this.addEventListener(MouseEvent.MOUSE_OUT, dehors, false, 10);
			this.addEventListener(MouseEvent.MOUSE_OVER, dedans, false, 10);
			this.addEventListener(MouseEvent.MOUSE_DOWN, doMouseDown, false, 10);

			// Cette partie permet d'executer le script php directement en laçant l'application
			var loader:URLLoader;
			var request:URLRequest=new URLRequest("http://127.0.0.1/ProjetTaweb/scriptServeur.php?" + Math.floor(Math.random() * this.limite));

			loader=new URLLoader();

			try
			{
				loader.load(request);
			}
			catch (error:SecurityError)
			{
				trace("Il y'a un problème de sécurité.");
			}

		}


		/**
		 * Réaffichage de la grille en fonction de la valeur du slider
		 * @param valSlide valeur du slide
		 */
		public function paint(valSlide:int):void
		{
			var i:int;

			var save:int=valSlide;
			graphics.clear();
			graphics.lineStyle(1, 0, 1);
			graphics.drawRect(0, 0, gridSize, gridSize);

			graphics.lineStyle(1, 0xcccccc, 1);
			valSlide=echelleNormale - valSlide;
			pasSize=valSlide;

			objetProportion=pasSize / echelleNormale;

			// Pour tracer les lignes de la grille
			for (i=valSlide; i < gridSize; i+=valSlide)
			{
				graphics.moveTo(i, 1);
				graphics.lineTo(i, gridSize);

				graphics.moveTo(1, i);
				graphics.lineTo(gridSize, i);
			}
			this.taille=(600 / (60 - save)) * 100;
		}


		/**
		 * L'utilisateur a cliqué sur un bouton de sélection
		 * @param nomBouton nom du boutton
		 */
		public function selectionBouton(nomBouton:String):void
		{
			if (nomBouton == "buttonStartLoc")
				typeSelection="startLoc";
			else
				typeSelection=nomBouton;

			var i:int;
			cercle.graphics.clear(); // efface le petit rond rouge
			ligne.graphics.clear(); // et aussi la ligne

			// Gestion de l'icône associée à la souris
			Mouse.show();

			switch (typeSelection)
			{
				case 'porte':

					//Chaque sélection d'un objet entraine l'instanciation de sa classe
					for (i=0; i < tabMurs.length; i++)
						tabMurs[i].ajoutListenerOuverture(typeSelection);
					break;

				case 'fenetre':
					for (i=0; i < tabMurs.length; i++)
						tabMurs[i].ajoutListenerOuverture(typeSelection);
					break;

				case 'oeuvre':
					for (i=0; i < tabMurs.length; i++)
						tabMurs[i].ajoutListenerOuverture(typeSelection);
					this.oeuvrePose=true;
					break;
			}

			if (typeSelection != 'porte' && typeSelection != 'fenetre' && typeSelection != 'oeuvre')
			{
				for (i=0; i < tabMurs.length; i++)
				{
					tabMurs[i].removeListenerOuverture();
				}
			}
		}
		

		/**
		 * L'utilisateur a cliqué sur la grille
		 * @param event évènement souris
		 */
		private function clicSurLaGrille(event:MouseEvent):void
		{
			var angle:Angle;
			var roundX:uint=Math.round(event.localX / pasSize) * pasSize;
			var roundY:uint=Math.round(event.localY / pasSize) * pasSize;

			// Il était en train de définir les murs
			if (typeSelection == 'mur')
			{
				graphics.lineStyle(5, 0x000000, 1);
				if (x1 == -1 && y1 == -1)
				{
					x1=roundX;
					y1=roundY;
				}
				else
				{
					var mur:Mur=new Mur(x1, y1, roundX, roundY, x1 + y1 + roundX);
					addChild(mur);

					var nbAnglesCommuns:int=0;
					for (var i:int=tabMurs.length - 1; i >= 0; i--)
					{
						if (tabMurs[i].contientPoint(x1, y1) && (roundX != x1 || roundY != y1))
						{
							angle=new Angle(x1, y1, tabAngles.length + 1);
							tabAngles.push(angle);
							addChild(angle);
							nbAnglesCommuns++;
						}
						else if (tabMurs[i].contientPoint(roundX, roundY) && (roundX != x1 || roundY != y1))
						{
							angle=new Angle(roundX, roundY, tabAngles.length + 1);
							tabAngles.push(angle);
							addChild(angle);
							nbAnglesCommuns++;
						}
					}

					tabMurs.push(mur);
					if (nbAnglesCommuns == 2)
					{
						x1=-1;
						y1=-1;
					}
					else
					{
						x1=roundX;
						y1=roundY;
					}
				}
			}
			else if (typeSelection == "startLoc")
			{
				coordStartLoc=new Array();
				startLoc.graphics.clear();
				startLoc.graphics.lineStyle(5, 0xFF6600);
				startLoc.graphics.drawCircle(roundX, roundY, 5);
				startLoc.graphics.lineStyle(1, 0);
				coordStartLoc.push([roundX, roundY]);
					//Alert.show("x : "+startLoc.x+" y : "+startLoc.y);
			}
		}




		/**
		 * L'utlisateur a double-cliqué sur la grille
		 * il termine la création des murs
		 * @param event évènement souris
		 */
		private function doubleClicSurLaGrille(event:MouseEvent):void
		{
			var angle:Angle;

			var roundX:uint=Math.round(event.localX / pasSize) * pasSize;
			var roundY:uint=Math.round(event.localY / pasSize) * pasSize;

			graphics.lineStyle(5, 0x000000, 1);
			if (x1 == -1 && y1 == -1)
			{
				x1=event.localX;
				y1=event.localY;
			}
			else
			{
				var mur:Mur=new Mur(x1, y1, roundX, roundY, x1 + y1);
				addChild(mur);

				for (var i:int=0; i < tabMurs.length; i++)
				{
					if (tabMurs[i].contientPoint(x1, y1) && (roundX != x1 && roundY != y1))
					{
						angle=new Angle(x1, y1, tabAngles.length + 1);
						tabAngles.push(angle);
						addChild(angle);
					}

					if (tabMurs[i].contientPoint(roundX, roundY) && (roundX != x1 && roundY != y1))
					{
						angle=new Angle(roundX, roundY, tabAngles.length + 1);
						tabAngles.push(angle);
						addChild(angle);
					}
				}

				if (roundX != x1 && roundY != y1)
					tabMurs.push(mur);
				x1=-1;
				y1=-1;
			}
		}


		/**
		 * Déplacement de la souris sur la grille
		 * @param event évènement souris
		 */
		private function deplacementSurLaGrille(event:MouseEvent):void
		{
			if (typeSelection == 'mur')
			{
				//affichage du petit rond rouge
				cercle.graphics.clear();
				cercle.graphics.lineStyle(1, 0xFF0000, 1);
				cercle.graphics.drawCircle(Math.round(event.localX / pasSize) * pasSize, Math.round(event.localY / pasSize) * pasSize, 5);

				if (x1 == -1 && y1 == -1)
					ligne.graphics.clear();
				if (x1 != -1 && y1 != -1)
				{
					//et du futur mur en grisé
					ligne.graphics.clear();
					ligne.graphics.lineStyle(2, 0xbfbfbf, 1);
					ligne.graphics.moveTo(Math.round(x1 / pasSize) * pasSize, Math.round(y1 / pasSize) * pasSize);
					ligne.graphics.lineTo(Math.round(event.localX / pasSize) * pasSize, Math.round(event.localY / pasSize) * pasSize);
				}
			}
			else if (typeSelection == 'startLoc')
			{
				cercle.graphics.clear();
				cercle.graphics.lineStyle(1, 0xFF6600, 1);
				cercle.graphics.drawCircle(Math.round(event.localX / pasSize) * pasSize, Math.round(event.localY / pasSize) * pasSize, 2);
			}
		}



		/**
		 * Placement d'une porte, d'une fenêtre ou d'une oeuvre sur un mur
		 * @param pxOuverture abscisse de l'ouverture
		 * @param pyOuverture ordonnée de l'ouverture
		 * @param prOuverture rotation de l'ouverture
		 * @param idOuverture identifiant de l'ouverture
		 * @see Mur.clicSurUnMurPourPlacerUneOuverture()
		 */
		public function ajoutOuverture(pxOuverture:int, pyOuverture:int, prOuverture:int, idOuverture:int):void
		{
			var ouverture:BitmapLoader=new BitmapLoader("icons/" + typeSelection + ".png");

			//alert.show("Dans GridRoom::ajoutOuverture");
			ouverture.x=pxOuverture;
			ouverture.y=pyOuverture;

			//ouverture.scaleX=objetProportion;
			//ouverture.scaleY=objetProportion;
			ouverture.rotation=prOuverture;
			ouverture.visible=true;
			addChild(ouverture);
			tabOuvertures.push(new Ouverture(typeSelection, pxOuverture, pyOuverture, pasSize, idOuverture));

			//on concatène l'url de l'ouverture avec l'id de l'ouverture et son type (porte)
			//Cela nous permettra de ne pas le confondre avec un autre dans le même tableau

			listeUrlImage.push(idOuverture.toString(10) + "*" + typeSelection + "*" + this.urlImageCourante);
			if (typeSelection == "oeuvre")
			{
				listeDescription.push(idOuverture.toString(10) + "/" + this.texte);
				for (var i:int=0; i < tabMurs.length; i++)
				{
					tabMurs[i].removeListenerOuverture();
				}

			}
			else if (typeSelection == "porte")
			{
				listeIdTransition.push(idOuverture.toString(10) + "/" + this.idTransition);
				for (var j:int=0; j < tabMurs.length; j++)
				{
					tabMurs[j].removeListenerOuverture();
				}
			}
		}


		/**
		 * Zoom sur la grille
		 * @param taille valeur pour réaliser le zoom
		 */
		public function zoom(taille:String):void
		{
			switch (taille)
			{
				case "plusGrand":
					setScale(scale + 0.2);
					break;
				case "plusPetit":
					if (scale >= 0.2)
						setScale(scale - 0.2);
					break;
				case "normal":
					setScale(0.99);
					break;
			}
		}


		/**
		 * Fixe la taille du pas sur la grille
		 * @param pScale valeur qui permet de fixer le pas
		 */
		public function setScale(pScale:Number):void
		{
			scale=pScale;
			scaleX=pScale;
			scaleY=pScale;
		}


		/**
		 * Fonction qui fait disparaître les bitmap des ouvertures lorsque la souris est à l'extérieur
		 * @param event évènement souris
		 */
		private function dehors(event:MouseEvent):void
		{
			bmp.visible=false;
			Mouse.show();
		}


		/**
		 * Fonction qui fait apparaître les bitmap des meubles lorsque la souris est à l'extérieur
		 * @param event évènement souris
		 */
		private function dedans(event:MouseEvent):void
		{
			if (typeSelection == 'table' || typeSelection == 'chaise')
			{
				bmp.visible=true;
				Mouse.hide();
			}
		}


		/**
		 * Charge le fichier xml sur le serveur
		 * @param nomF nom du fichier à charger
		 */
		public function lireFichier(nomF:String):void
		{
			//On récupère le fichier sur le serveur:
			var request:URLRequest=new URLRequest("http://127.0.0.1/ProjetTaweb/Serveur/Accordeon/salles/" + nomF + "?" + Math.floor(Math.random() * this.limite));
			var loader:URLLoader=new URLLoader();

			try
			{
				//Ecouteur d'évènements:
				loader.addEventListener(Event.COMPLETE, chargementMurs);
				loader.addEventListener(IOErrorEvent.IO_ERROR, erreur);
				loader.load(request);
			}
			catch (e:SecurityError)
			{
				Alert.show("Il y'a un problème de sécurité.");
				trace("Il y'a un problème de sécurité.");
			}
		}

		/**
		 * Fonction indiquant si une erreur de chargmement survient
		 */
		private function erreur(event:Event):void
		{
			Alert.show(event + "");
			trace(event);
		}

		/**
		 * Fonction qui parse le fichier xml récupéré
		 */
		private function chargementMurs(event:Event):void
		{
			try
			{
				//On récupère les infos xml:
				var fichierXML:XML=new XML(event.target.data);
				//Variables intermédiaires:
				var pasSize:int=parseInt(fichierXML.@pas);
				var taille:int=parseInt(fichierXML.@taille);
				var idS:String=fichierXML.@id;
				this.taille=taille;
				this.pasSize=pasSize;
				this.paint(this.echelleNormale - this.pasSize);

				//On parcourt le xml pour récupérer d'abord les balises "mur":
				for each (var MUR:XML in fichierXML..Wall)
				{
					//Pour chaque "mur", on récupère les coordonnées "x1-Y1" et "x2-y2":
					var x1:int=(parseInt(MUR.Vertix[0].@x) * pasSize) / 100;
					var y1:int=Math.abs((parseInt(MUR.Vertix[0].@y) - taille) * pasSize) / 100;
					var x2:int=(parseInt(MUR.Vertix[1].@x) * pasSize) / 100;
					var y2:int=Math.abs((parseInt(MUR.Vertix[1].@y) - taille) * pasSize) / 100;
					var mur:Mur=new Mur(x1, y1, x2, y2, x1 + y1 + x2);
					addChild(mur);
					tabMurs.push(mur);
					for each (var PORTE:XML in MUR..Objects..object)
					{
						if (PORTE.@type == "porte")
						{
							var valX:int;
							var valY:int;
							var iy1:int=parseInt(PORTE.Vertix[0].@y);
							var idP:String=PORTE.@id;
							if (pasSize != 0)
							{
								iy1=parseInt(PORTE.Vertix[0].@y) * pasSize / 100;
								valX=parseInt(PORTE.Vertix[0].@x) * pasSize / 100;
								valY=Math.abs((parseInt(PORTE.Vertix[0].@y) - taille) * pasSize) / 100
							}
							else
							{
								iy1=parseInt(PORTE.Vertix[0].@y) / 100;
								valX=parseInt(PORTE.Vertix[0].@x) / 100;
								valY=Math.abs(iy1 - taille);
							}
							var porte:Ouverture=new Ouverture("porte", valX, valY, this.pasSize, x1 + x2 + y1);
							typeSelection="porte";
							var ouverture:BitmapLoader=new BitmapLoader("icons/" + typeSelection + ".png");
							ouverture.x=valX;
							ouverture.y=valY;
							ouverture.scaleX=objetProportion;
							ouverture.scaleY=objetProportion;
							ouverture.rotation=(-Math.atan(((x1 - x2) / (y1 - y2))) / Math.PI * 180 + 90);
							;
							ouverture.visible=true;
							addChild(ouverture);
							tabBitmapLoader.push(ouverture);
							tabOuvertures.push(porte);
						}
					}
				}
			}
			catch (e:TypeError)
			{
				//Si il y a une erreur:
				Alert.show("Impossible de récupérer le contenu du xml");
			}
		}

		/**
		 * Fonction de réinitialisation
		 */
		public function reInit():void
		{
			this.removeAllChildren();
			

			cercle=new UIComponent();
			addChild(cercle);
			
			ligne=new UIComponent();
			addChild(ligne);
			
			startLoc=new UIComponent();
			addChild(startLoc);

			tabBitmapLoader=new Array();
			tabMurs=new Array();
			tabOuvertures=new Array();
			tabMeubles=new Array();
			tabAngles=new Array();
			coordStartLoc = new Array();
			listeDescription=new Array(); //comporte l'ensemble des description des oeuvres
			listeUrlImage=new Array(); //on stocke dedans tous les "urlImageCourante"

		}

		/**
		 * Fonction qui calcule un id compris entre 0 et 100000
		 * @return retourne cet id
		 */ 
		private function idAleatoire():Number
		{
			var id:Number=Math.floor(Math.random() * this.limite);
			return id;
		}

		/**
		 * Fonction qui récupère le fichier .xml d'une salle et change la couleur d'une porte
		 * @param nomS nom de la salle
		 */
		
		
		/**
		 * Fonction qui récupère le fichier conf.xml
		 * @param nomS nom de la salle
		 */
		public function lireFichierConf(nomS:String):void
		{
			//On récupère le fichier sur le serveur:
			var request:URLRequest=new URLRequest("http://127.0.0.1/ProjetTaweb/Serveur/Accordeon/salles/conf.xml?" + Math.floor(Math.random() * this.limite));
			var loader:URLLoader=new URLLoader();
			this.nomSalle=nomS;
			try
			{
				//Ecouteur d'évènements:
				loader.load(request);
				loader.addEventListener(Event.COMPLETE, majFichierConf);
				loader.addEventListener(IOErrorEvent.IO_ERROR, erreurConf);
			}
			catch (e:SecurityError)
			{
				Alert.show("Il y'a un problème de sécurité.");
				trace("Il y'a un problème de sécurité.");
			}
		}

		/**
		 * Fonction indiquant si une erreur de chargmement survient
		 */ 
		private function erreurConf(event:Event):void
		{
			Alert.show(event + "");
			trace(event);
		}

		/**
		 * Fonction qui parse le fichier xml récupéré
		 */ 
		private function majFichierConf(event:Event):void
		{
			try
			{
				//On récupère les infos xml:
				var confXML:XML=new XML(event.target.data);
				//Alert.show(confXML.toXMLString());
				//On récupère l'identifiant pour la salle:
				this.identifiantSalle=parseInt(confXML..config..identifiant.@id);

				//On l'incrémente cet identifiant dans conf.xml (pour la prochaine salle):
				var idSalleNext:int=this.identifiantSalle + 1;

				//On modifie alors cet identifiant dans le xml:
				confXML..config..identifiant.@id=idSalleNext + "";

				//On construit la ligne a ajouter au fichier xml:
				var path:String="http://127.0.0.1/ProjetTaweb/Serveur/Accordeon/salles/" + this.nomSalle + ".xml";
				var idSalleS:String="" + this.identifiantSalle;
				var newRoom:XML=<room id={idSalleS} name={this.nomSalle} path={path} />;

				var adresse:XMLList=confXML.index;
				adresse.appendChild(newRoom);

				//On envoie le traitement au script php:
				var myRequest:URLRequest=new URLRequest("http://127.0.0.1/ProjetTaweb/UploaderConfRoom.php?" + Math.floor(Math.random() * this.limite));
				var myLoader:URLLoader=new URLLoader();
				var myVariables:URLVariables=new URLVariables();

				myVariables.XMLDescription=confXML;

				myRequest.method=URLRequestMethod.POST; //met XMLDescription dans $_POST[] pour être récupéré par le script PHP
				myRequest.data=myVariables;
				myLoader.load(myRequest);
				
				var myRequest2:URLRequest = new URLRequest("http://127.0.0.1/ProjetTaweb/UploaderScript.php");
				var myLoader2:URLLoader = new URLLoader();
				var myVariables2:URLVariables = new URLVariables();
				
				myVariables2.RoomName = this.nomSalle;
				myVariables2.XMLDescription = this.ecrireFichier(this.nomSalle);  //Récupère toute la description XML et la stocke dans XMLDescription
				
				myRequest2.method = URLRequestMethod.POST;  //met XMLDescription dans $_POST[] pour être récupéré par le script PHP
				myRequest2.data = myVariables2;
				myLoader2.load(myRequest2);
				
				
			}
			catch (e:TypeError)
			{
				//Si il y a une erreur:
				Alert.show("Impossible de récupérer le contenu du xml");
				trace("Impossible de récupérer le contenu du xml");
				trace(e.message);
			}
		}


		/**
		 * Création du fichier xml de la salle que l'on crée
		 * @param nomSalle nom de la salle
		 * @return du xml sous forme d'une chaine de caractère
		 */
		public function ecrireFichier(nomSalle:String):String
		{
			var i:int=0;
			var g:int=0;
			var j:int=0;
			var h:int=0;
			var k:int=0;
			var p:int=0;
			var z:int=0;
			var a:int=0;
			var b:int=0;

			var comptPorte:int=0;

			var chaine:String="<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

			//var idSalle:Number = idAleatoire();
			//On stock le nom de la salle:
			this.nomSalle=nomSalle;
			chaine=chaine + "<Room id=\"" + this.identifiantSalle + "\" name=\"" + this.nomSalle + "\" taille=\"" + this.taille + "\" pas=\"" + this.pasSize + "\">" + "<Startloc>" + "<Vertix x=\"" + (100 * coordStartLoc[0][0] / pasSize).valueOf() + "\" y=\"" + (Math.abs((100 * coordStartLoc[0][1] / pasSize) - this.taille)).valueOf() + "\"/>" + "</Startloc>";


			// ajout des murs
			for (i=0; i < tabMurs.length; i++)
			{
				chaine+="<Wall>";
				chaine+=tabMurs[i].toXml(this.taille);
				//chaine +="<src>";
				//chaine += this.urlImageMur;
				//chaine += "</src>";
				chaine+="<Objects>";

				// ajout des ouvertures
				for (j=0; j < tabOuvertures.length; j++)
				{
					if (tabMurs[i].idMur == tabOuvertures[j].idOuverture)
					{
						switch (tabOuvertures[j].typeOuverture)
						{
							case "porte":
								comptPorte++;
								chaine+="<object id=\"p" + comptPorte + "\" type=\"porte\" >";
								chaine+=tabOuvertures[j].toXml(this.taille, this.pasSize);

								for (a=b; a < listeIdTransition.length; a++)
								{
									var txt:String=listeIdTransition[a];
									var tab:Array=txt.split('/');
									var part1:int=tab[0].valueOf();
									var part2:String=tab[1];

									if (part1 == tabOuvertures[j].idOuverture)
									{
										chaine+="<Transition id=\"" + part2 + "\"/>";
										b=a + 1;
										break;
									}
								}
								chaine+= "<Color id=\"16776960\" />";
								chaine+="</object>";
								break;

							case "fenetre":
								chaine+="<object id=\"" + tabOuvertures[j].idOuverture + "\" type=\"fenetre\" >";
								chaine+=tabOuvertures[j].toXml(this.taille, this.pasSize);
								/*
								chaine  +="<src>";

								for (var b:int =h; b<listeUrlImage.length; b++)
								{
									var url1:String =listeUrlImage[b];
									var tabl1:Array = url1.split('*');
									var par1:int = tabl1[0].valueOf();
									var par2:String = tabl1[1];
									var par3:String = tabl1[2];
									if(par1 == tabOuvertures[j].idOuverture && par2 == tabOuvertures[j].typeOuverture)
									{
										chaine+= par3+ " ";
										h = b+1;
										break;
									}
								}
								chaine  +="</src>";
								//*/
								chaine+="</object>";
								break;

							case "oeuvre":
								chaine+="<object id=\"" + tabOuvertures[j].idOuverture + "\" type=\"oeuvre\" >";
								chaine+=tabOuvertures[j].toXml(this.taille, this.pasSize);
								//*
								chaine  +="<src>";

								for (var c:int =p; c<listeUrlImage.length; c++)
								{
									var uri:String =listeUrlImage[c];
									var tabl2:Array = uri.split('*');
									var parti1:int = tabl2[0].valueOf();
									var parti2:String = tabl2[1];
									var parti3:String = tabl2[2];

									if(parti1 == tabOuvertures[j].idOuverture && parti2 == tabOuvertures[j].typeOuverture)
									{
										chaine+= parti3+ " ";
										p = c+1;
										break;
									}
								}
								chaine  +="</src>";
								//*/
								chaine+="<description>";

								for (k=z; k < listeDescription.length; k++)
								{
									var txt:String=listeDescription[k];
									var tab:Array=txt.split('/');
									var part1:int=tab[0].valueOf();
									var part2:String=tab[1];

									if (part1 == tabOuvertures[j].idOuverture)
									{
										chaine+=part2 + " ";
										z=k + 1;
										break;
									}
								}
								chaine+="</description>";
								chaine+="</object>";
								break;
						}

					}

				}
				chaine+="</Objects>";
				chaine+="</Wall>";
			}
			chaine+="</Room>";

			return chaine;
		}



		/**
		 *
		 * @param px
		 */
		public function ghostSetX(px:int):void
		{
			bmp.x=px - 50;
		}

		/**
		 *
		 * @param py
		 */
		public function ghostSetY(py:int):void
		{
			bmp.y=py - 50;
		}

		/**
		 *
		 * @return
		 */
		public function getMode():String
		{
			return typeSelection;
		}

		/**
		 * Retourne la proportion des objets
		 * @return la proportion des objets
		 */
		public function getProp():Number
		{
			return objetProportion;
		}

		private function doMouseDown(e:MouseEvent):void
		{
			//	Alert.show("mousedow");
			//	viderSelec();
			if (rectSelect == null && typeSelection == "curseur")
			{
				rectSelect=new UIComponent();
				addChild(rectSelect);

				xOrigPosMouse=e.localX;
				yOrigPosMouse=e.localY;
			}
		}


		/**
		 *
		 * @param fct
		 * @param event
		 */
		public function exec(fct:String, event:MouseEvent):void
		{
			var i:int;
			if (fct == 'gauche')
			{
				for (i=0; i < meublesSelec.length; i++)
				{
					meublesSelec[i].pivoteGauche(event);
				}
			}

			if (fct == 'droite')
			{
				for (i=0; i < meublesSelec.length; i++)
				{
					meublesSelec[i].pivoteDroit(event);
				}
			}

			if (fct == 'suppr')
			{
				for (i=0; i < meublesSelec.length; i++)
				{
					meublesSelec[i].supprime(event);
				}
			}

			if (fct == 'plus')
			{
				for (i=0; i < meublesSelec.length; i++)
				{
					meublesSelec[i].zoomPlus(event);
				}
			}

			if (fct == 'moins')
			{
				for (i=0; i < meublesSelec.length; i++)
				{
					meublesSelec[i].zoomMoins(event);
				}
			}
		}



		/**
		 * 
		 */
		public function afficheAngle():void
		{
			for (var i:uint=0; i < tabAngles.length; i++)
			{
				tabAngles[i].paint();
			}
		}


	}
}